#第四章：列表

#列表（list）是一种有序和可更改的集合，列表中允许存在重复的成员。

#创建列表：
#在Python中，[]表示一个空列表。比如：
a = []
print(type(a))  # <class 'list'>
print(a)        # []

#此外，也可以通过list()的方式来创建一个空列表。比如：
b = list()
print(type(b))  # <class 'list'>
print(b)        # []

#创建非空列表：
#创建列表时可以在[]中设置列表的初始值。比如：
c = [1, 2, 3, 4, 5]
print(type(c))  # <class 'list'>
print(c)        # [1, 2, 3, 4, 5]

#需要注意的是，列表中存放的元素可以是不同类型的。比如：
d = [1, 'hello', True, [4, 5, 6]]
print(type(d))  # <class 'list'>
print(d)        # [1, 'hello', True, [4, 5, 6]]

#使用append方法可以在列表末尾新增一个元素。比如：
d.append(2024)
d.append('xioaxiaounicorn')
print(d)

#使用insert方法可以在指定下标位置新增元素。比如：
d.insert(0,5)
d.insert(100,'unicorn')
print(d)

#使用pop方法可以删除列表最末尾的元素。比如：
d.pop()
print(d)

#pop方法也可以删除指定下标位置的元素。比如：
d.pop(3)
print(d)

#使用remove方法可以指定删除列表中特定值的元素。比如：
d.remove(2024)
print(d)

d.append('xiaoxiaounicorn')
print(d)

#出现相同元素。删除首次出现的那个：
d.remove('xiaoxiaounicorn')
print(d)

#查找：
#使用in和in not操作符能够判定某个元素是否在列表中存在。比如：
print(1 in d)       # True
print(10 in d)      # False
print(1 not in d)   # false
print(10 not in d)  # True

#index方法也可以判定某个元素是否在列表中存在
#使用index方法时，如果待查找元素在列表中，则返回该元素的下标，否则会抛出异常。
print(d.index(5))

#下标访问元素：[]
print(d[4])

#下标还可以修改：
d[2]='unicorn'
print(d)
#如果指定下标的值超过了列表中的最大下标，则会抛出异常。

#负索引
#负索引其实就是从列表的最后一个元素开始往前，依次为-1、-2、-3、…。
print(d[-1])

#遍历列表：
#Python中的for循环可以直接遍历一个可迭代对象。比如：
for elem in d:
    print(elem)

#但需要注意的是，该方法下对循环变量的修改不会影响列表中的元素值。比如：
for elem1 in c:
    print(elem1)
    elem1 = elem1 + 10  # 不会影响列表中的元素值
print(c)  # [1, 2, 3, 4]


#此外，也可以用for循环遍历列表元素下标，然后以下标的方式依次遍历列表中的元素。比如：
for i in range(len(d)):
    print(d[i])

#以这种方式遍历列表元素，就能够对列表元素进行修改。比如：
for i in range(len(c)):
    print(c[i])
    c[i] = c[i] + 10  # 会影响列表中的元素值
print(c)  # [11, 12, 13, 14,15]

#while循环遍历：
j=0
while j<len(d):
    print(d[j])
    j+=1

#子列表提取：
#[起始下标：结束下标]
print(d)
#左闭右开区间：
print(d[0:6])

#切片的过程：
print(d[2:])
print(d[:])
print(d[:5])



#切片时指定步长：
f=[1,2,3,4,5,5,6,7,8,10]
print(f[::1])
print(f[::2])
print(f[::3])
print(f[0:4:2])

#切片的步长也可以为负数：表示从后往前提取元素：
print(f[::-1])
print(f[::-2])
print(f[::-3])

#切片时下标越界问题：
#如果切片时填写的下标超出了有效范围，运行程序后不会抛异常，而是尽可能把符合要求的元素提取出来。比如：
print(f[0:100])

#拼接列表：
#使用+可以把两个列表拼接在一起。比如：
#+的先后顺序也会有区别：
e=f+d
print(d)
print(f)
print(e)

#使用extend方法，可以把一个列表拼接到另一个列表的后面。比如：
#把f拼接到d的后面
e.extend(f)
print(e)
print(f)

#s使用+=也可以把一个列表拼接到另一个列表的后面。比如：
d+=f
print(f)
print(d)

#reverse颠倒列表中元素的顺序
f.reverse()
print(f)

#sort对列表中元素进行排序
f.sort()
print(f)


#元组与列表几乎相同，但是元组不可修改







